/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package documenteditor.entidade.model;

import documenteditor.entidade.model.dominio.Cidade;
import documenteditor.entidade.model.dominio.TipoEndereco;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.ForeignKey;

/**
 *
 * @author gleidson.moura
 */
@Entity
@Table(name="ENDERECO")
@SequenceGenerator(name="GEN_ENDERECO", sequenceName="GEN_ENDERECO_ID")
@NamedQueries({
    @NamedQuery(name = "Endereco.findAll", query = "SELECT e FROM Endereco e"),
    @NamedQuery(name = "Endereco.findByIdEndereco", query = "SELECT e FROM Endereco e WHERE e.idEndereco = :idEndereco"),
    @NamedQuery(name = "Endereco.findByBairro", query = "SELECT e FROM Endereco e WHERE e.bairro = :bairro"),
    @NamedQuery(name = "Endereco.findByCep", query = "SELECT e FROM Endereco e WHERE e.cep = :cep"),
    @NamedQuery(name = "Endereco.findByComplemento", query = "SELECT e FROM Endereco e WHERE e.complemento = :complemento"),
    @NamedQuery(name = "Endereco.findByNumero", query = "SELECT e FROM Endereco e WHERE e.numero = :numero"),
    @NamedQuery(name = "Endereco.findByReferencia", query = "SELECT e FROM Endereco e WHERE e.referencia = :referencia"),
    @NamedQuery(name = "Endereco.findByTipoEndereco", query = "SELECT e FROM Endereco e WHERE e.tipoEndereco = :tipoEndereco"),
    @NamedQuery(name = "Endereco.findByNomeRua", query = "SELECT e FROM Endereco e WHERE e.nomeRua = :nomeRua")})
public class Endereco implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name="ID_ENDERECO")
    @GeneratedValue(strategy = GenerationType.AUTO, generator="GEN_ENDERECO")
    private Long idEndereco;

    @Column(name="NOME_RUA", nullable=true)
    private String nomeRua;

    @Column(name="NUMERO", nullable=true)
    private Long numero;

    @Column(name="COMPLEMENTO", nullable=true)
    private String complemento;

    @Column(name="REFERENCIA", nullable=true)
    private String referencia;

    @Column(name="BAIRRO", nullable=true)
    private String bairro;

    @Column(name="CEP", nullable=true)
    private Long cep;

    @Column(name="TIPO_ENDERECO")
    @Enumerated(EnumType.ORDINAL)
    private TipoEndereco tipoEndereco;

    @ManyToOne(targetEntity=Cidade.class)
    @JoinColumn(name="ID_CIDADE", nullable=true)
    @ForeignKey(name="FK_ENDERECO_CIDADE")
    private Cidade cidade;

    @ManyToMany(targetEntity=documenteditor.entidade.model.Cliente.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name="ENDERECO_CLIENTE", joinColumns={@JoinColumn(name="ENDERECO_ID_ENDERECO")},
                                        inverseJoinColumns={@JoinColumn(name="CLIENTE_ID_CLIENTE")})
    private Set<Cliente> clientes = new HashSet<Cliente>();

    public Long getIdEndereco() {
        return idEndereco;
    }

    public void setIdEndereco(Long idEndereco) {
        this.idEndereco = idEndereco;
    }

    public String getNomeRua() {
        return nomeRua;
    }

    public void setNomeRua(String nomeRua) {
        this.nomeRua = nomeRua;
    }
    
    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public Long getCep() {
        return cep;
    }

    public void setCep(Long cep) {
        this.cep = cep;
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public Set<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(Set<Cliente> clientes) {
        this.clientes = clientes;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public Long getNumero() {
        return numero;
    }

    public void setNumero(Long numero) {
        this.numero = numero;
    }

    public String getReferencia() {
        return referencia;
    }

    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    public TipoEndereco getTipoEndereco() {
        return tipoEndereco;
    }

    public void setTipoEndereco(TipoEndereco tipoEndereco) {
        this.tipoEndereco = tipoEndereco;
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idEndereco != null ? idEndereco.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Endereco)) {
            return false;
        }
        Endereco other = (Endereco) object;
        if ((this.idEndereco == null && other.idEndereco != null) || (this.idEndereco != null && !this.idEndereco.equals(other.idEndereco))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "documenteditor.entidade.model.Endereco[id=" + idEndereco + "]";
    }

}
